/**********************************************************************************
 * 文件名称：
 * 功能说明：
 * 作者：laud（554163925@qq.com）
 * 修改记录
 *
**********************************************************************************/
#include "gsm.h"
#include "gsm_at.h"



SymbolTable symbols[] = {
    { "OK",         MDM_OK        },
    { "ERROR",      MDM_ERROR     },
    { "RING",       MDM_RING      },
    { "NO ANSWER",  MDM_NO_ANSWER },
    { "NO CARRIER", MDM_NO_CARRIER},
    { "BUSY",       MDM_BUSY      },
    { "READY",      MDM_READY     },
    { "CME ERROR",  MDM_CME_ERROR },
    { "CMS ERROR",  MDM_CMS_ERROR },
    { "IPR",        MDM_IPR       },
    { "CPIN",       MDM_CPIN      },
    { "CPAS",       MDM_CPAS      },
    { "CSQ",        MDM_CSQ       },
    { "CMUT",       MDM_CMUT      },
    { "CLIP",       MDM_CLIP      },
    { "CCWA",       MDM_CCWA      },
    { "CRING",      MDM_CRING     },
    { "CMTI",       MDM_CMTI      },
    { "CRSL",       MDM_CRSL      },
    { "CMGW",       MDM_CMGW      },
    { "PIN",        MDM_PIN       },
    { "PUK",        MDM_PUK       },
    { "COPS",       MDM_COPS      },
    { "CCLK",       MDM_CCLK      },
    { "CFUN",       MDM_CFUN      },
    { "CGSN",       MDM_CGSN      },
    { "CGMR",       MDM_CGMR      },
    { "ICCID",      MDM_CCID      },
    { "CGMM",       MDM_CGMM      },
    { "CGMI",       MDM_CGMI      },
    { "CNSMOD",     MDM_CNSMOD    },
    { "CREG",       MDM_CREG      },
    { "CGREG",      MDM_CGREG     },
    { "CEREG",      MDM_CEREG     },
    { "SIM",        MDM_SIM       },
    { "CNUM",       MDM_CNUM      },
    { "CIMI",       MDM_CIMI      },
    { "CSCA",       MDM_CSCA      },
    { "CPBR",       MDM_CPBR      },
    { "CMGR",       MDM_CMGR      },
    { "CMGR",       MDM_CMGR      },
    { "CMGL",       MDM_CMGL      },
    { "CMGW",       MDM_CMGW      },
    { "FSCD",       MDM_FSCD      },
    { "FSLS",       MDM_FSLS      },
    { "CGCLASS",    MDM_CGCLASS   },
    { "CFTPSSTART", MDM_CFTPSSTART},
    { "CFTPSLOGIN", MDM_CFTPSLOGIN},
    { "CFTPSGETFILE", MDM_CFTPSGETFILE},
    { "CGACT",      MDM_CGACT     },
    { "CGDCONT",    MDM_CGDCONT   },           
    { "CGATT",      MDM_CGATT     },
    { "CNSMOD",     MDM_CNSMOD    },
    { "CIPSEND",    MDM_SEND_OK   },
    { "+RECEIVE,",  MDM_RECEIVE   },
    { "+CIPOPEN",   MDM_CIPOPEN   },
    { NULL, 0                     }
}, *symbol_p = symbols;


static AtCmdHandler_Status MDM_Handler_SetECHO 				( MDM_CmdTypedef *at, MDM_RspTypedef *response );
static AtCmdHandler_Status MDM_Handler_ReadSerialPortRate   ( MDM_CmdTypedef *at, MDM_RspTypedef *response );
static AtCmdHandler_Status MDM_Handler_Alive                ( MDM_CmdTypedef *at, MDM_RspTypedef *atrsp );
static AtCmdHandler_Status MDM_Utils_Handler                ( MDM_CmdTypedef *at, MDM_RspTypedef *atrsp );

/* re-send time =  timeout * 10ms  */
static MDM_CmdTypedef commands[] 
= {
  { REPLY_COMMAND, "AT\r\n", 
  	500, 6,
    MDM_Handler_Alive, SIM_UNKNOWN, false },
  
  /* Disable command echos */
  { ENABLE_ECHO, "ATE1\r\n", 
  	100, 2, 
  	MDM_Handler_SetECHO, SIM_UNKNOWN, false },
	
	  /* query Local Terminal Serial Port Rate */
  { READ_SERIAL_PORT_RATE, "AT+IPR?\r\n", 
  	400, 2, 
  	MDM_Handler_ReadSerialPortRate, SIM_UNKNOWN, false },
//	
  /* Enable everything */
  { POWER_ON, "AT+CFUN=1\r\n", 
  	1500, 0, 
  	MDM_Utils_Handler, SIM_UNKNOWN, false },
	  /* Test modem is alive */

  { 0, NULL, 0, 0, NULL, SIM_UNKNOWN, false }
}, *command_p = commands;


static AtCmdHandler_Status SIM_Handler_QueryPINstatus ( MDM_CmdTypedef *at, MDM_RspTypedef *response );
static AtCmdHandler_Status SIM_Handler_QueryCCID ( MDM_CmdTypedef *at, MDM_RspTypedef *response );


static MDM_CmdTypedef sim_commands[] 
= {
  /* Query pin status */
  { PIN_QUERY, "AT+CPIN?\r\n", 
  	800, 4,
    SIM_Handler_QueryPINstatus, SIM_UNKNOWN, false },
  	  /* Get CCID */
  { SIM_ICCID_QUERY, "AT+CICCID\r\n",              
  	500, 0,
    SIM_Handler_QueryCCID, SIM_UNKNOWN, false },

  { 0, NULL, 0, 0, NULL, SIM_UNKNOWN, false }
}, *sim_command_p = sim_commands;


/*
**************************************************************************
* 函数名称： SIM_Handler_QueryCCID
* 功能描述： 查询ICCID处理
* 输入参数： NULL
* 输出参数： NULL
* 返 回 值： 
* 其它说明： 
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2017/10/12	  	V1.1.0	     goly         XXXX
***************************************************************************
*/
static AtCmdHandler_Status SIM_Handler_QueryCCID ( MDM_CmdTypedef *at, MDM_RspTypedef *response )
{

	MDM_RSP_ID code = MDM_GetResultCode ( response );
  if ( code == MDM_TIME_OUT )
  {

    //MDM_PostAtCmdByID ( sim_command_p, SIM_ICCID_QUERY, NULL );  
    return AT_HANDLER_ERROR;
  }
  else
  if ( code == MDM_ERROR )
  {
    //MDM_PostAtCmdByID ( sim_command_p, SIM_ICCID_QUERY, NULL );   
    return AT_HANDLER_ERROR;
  }
  else
  if ( code == MDM_OK )
	{	
//		//ascii * token = MDM_StrStr ( response, MDM_Sym2Str ( symbol_p, MDM_CCID ) );
//		if ( token ) 
//		{
//			token = MDM_StrStr ( response, "+ICCID:" );
//			token=token+8;
//			//strncpy ( ( char * )vehicleParams.ICCID, ( const char * )token, 20 );
//			lgsm_sim_get_auth_status(NULL);	
//			return AT_HANDLER_DONE;
//		}
	}
	return AT_HANDLER_DONT_UNDERSTAND;
}

/*
**************************************************************************
* 函数名称： MDM_Utils_ParseCMEerror
* 功能描述： Parses cme error and stoes it to given variable
* 输入参数： response string to parse cms error from , code code to store cms code
* 输出参数： 
* 返 回 值： true if cms error was found and parsed from response
* 其它说明： 
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2017/10/12	  	V1.1.0	     goly         XXXX
***************************************************************************
*/
static bool MDM_Utils_ParseCMEerror ( MDM_RspTypedef *response, int32_t *code )
{
  ascii *token = MDM_StrStr ( response, MDM_Sym2Str ( symbol_p, MDM_CME_ERROR ) );

  if ( token )
  {
    token = ( ascii* ) strchr ( ( const char* )token, ' ' );
    if ( token )
    {
      *code = atoi ( ( const char* )token );
      return true;     
    } 
  }
  return false;
}

/*
**************************************************************************
* 函数名称： SIM_Handler_QueryPINstatus
* 功能描述： 查询PIN状态处理
* 输入参数： NULL
* 输出参数： NULL
* 返 回 值： 
* 其它说明： 
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2017/09/29	  	V1.1.0	     goly         XXXX
***************************************************************************
*/
static AtCmdHandler_Status SIM_Handler_QueryPINstatus ( MDM_CmdTypedef *at, MDM_RspTypedef *response )
{
  MDM_RSP_ID code = MDM_GetResultCode ( response );

  /* Modem didn't reply or replied with an error */
  if ( code == MDM_ERROR )
  {
    int32_t errorCode = 0;
    if ( true == MDM_Utils_ParseCMEerror ( response, &errorCode ) )
    {
      switch ( errorCode )
      {
        case SIM_ERR_NO_CARD:
          SIM_ChangeAuthStatus ( NULL, SIM_MISSING, "SIM_MISSING", true );
          return AT_HANDLER_DONE_ERROR;
        default:
          SIM_ChangeAuthStatus ( NULL, SIM_INIT, "SIM_INIT", true );
          return AT_HANDLER_RETRY;
      }
    }
  }
  else if ( code == MDM_TIME_OUT )
  {
    SIM_ChangeAuthStatus ( NULL, SIM_ERROR, "SIM_ERROR", true );
    return AT_HANDLER_DONE_ERROR;
  }
  else
  {
    ascii *token = MDM_StrStr ( response, MDM_Sym2Str ( symbol_p, MDM_CPIN ) );
    if ( token )
    {
      if ( strstr ( ( const char* )token, "READY" ) )
      {       
				SIM_ChangeAuthStatus ( NULL, SIM_READY, "SIM_READY", true );
				return AT_HANDLER_DONE;
      }
      else 
      if ( strstr ( ( const char* )token, "SIM" ) )
      {
        if ( strstr ( ( const char* )token, "PIN" ) )
        {
          SIM_ChangeAuthStatus ( NULL, SIM_NEED_PIN, "SIM_NEED_PIN", true );  
        }
        else 
        if ( strstr ( ( const char* )token, "PUK" ) )
        {
          SIM_ChangeAuthStatus ( NULL, SIM_NEED_PUK, "SIM_NEED_PUK", true );  
        }
        return AT_HANDLER_DONE; 
      }
    }
  }
  return AT_HANDLER_DONT_UNDERSTAND;
}

/*
**************************************************************************
* 函数名称： MDM_Handler_SetECHO 
* 功能描述： ECHO处理
* 输入参数： 
* 输出参数： 
* 返 回 值： 
* 其它说明： 
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2017/10/12	  	V1.1.0	     goly         XXXX
***************************************************************************
*/
static AtCmdHandler_Status MDM_Handler_SetECHO ( MDM_CmdTypedef *at, MDM_RspTypedef *response )
{
	
	MDM_RSP_ID code = MDM_GetResultCode ( response );

  if ( code == MDM_ERROR )
  {
    return AT_HANDLER_DONE_ERROR;
  }
  else if ( code == MDM_TIME_OUT )
  {
    return AT_HANDLER_RETRY;
  }
  else if ( code == MDM_OK )
  {
    return AT_HANDLER_DONE;
  }

	return AT_HANDLER_DONT_UNDERSTAND;
}



static AtCmdHandler_Status NETWORK_Handler_QueryNetworkRegistration ( MDM_CmdTypedef *at, MDM_RspTypedef *response );
//static AtCmdHandler_Status NETWORK_Handler_QuerySignalStrength ( MDM_CmdTypedef *at, MDM_RspTypedef *response );
//static AtCmdHandler_Status NETWORK_Handler_NetworkRegister ( MDM_CmdTypedef *at, MDM_RspTypedef *response );
//static AtCmdHandler_Status NETWORK_Handler_QueryGprsNetworkRegistration ( MDM_CmdTypedef *at, MDM_RspTypedef *response );



static MDM_CmdTypedef network_commands[] 
= {	
	 /* Network registration */
  { NETWORK_REG_QUERY, "AT+CREG?\r\n", 
  	1000, 5,
    NETWORK_Handler_QueryNetworkRegistration, SIM_UNKNOWN, false },

//  /* Network registration */
//  { GPRS_NETWORK_CGREG_QUERY, "AT+CGREG?\r\n", 
//  	1000, 6,
//    NETWORK_Handler_QueryGprsNetworkRegistration, SIM_READY, false },

//  /* Network registration */
//  { NETWORK_REG_ENABLE, 	"AT+CREG=1\r\n", 
//  	1500, 2,
//    NETWORK_Handler_NetworkRegister, SIM_UNKNOWN, false },

//  /* Query signal strength */
//  { SIGNAL_QUERY, "AT+CSQ\r\n", 
//  	1000, 5,
//    NETWORK_Handler_QuerySignalStrength, SIM_READY, false },
//	
//  { 0, NULL, 0, 0, NULL, SIM_UNKNOWN, false }
	
}, *network_command_p = network_commands;

void NETWORK_Command_QueryGprsNetworkRegistration ( void* ipc_data )
{
    MDM_PostAtCmdByID ( network_command_p, 
                      GPRS_NETWORK_CGREG_QUERY, 
                      NULL );
}


/*
**************************************************************************
* 函数名称： NETWORK_Handler_QueryNetworkRegistration
* 功能描述： 网络注册查询处理
* 输入参数：
* 输出参数： 
* 返 回 值： 
* 其它说明： 
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2017/10/12	  	V1.1.0	     goly         XXXX
***************************************************************************
*/
static AtCmdHandler_Status NETWORK_Handler_QueryNetworkRegistration ( MDM_CmdTypedef *at, MDM_RspTypedef *response )
{
    MDM_RSP_ID code = MDM_GetResultCode ( response );

    /* for queryNetworkRegistration */
    if ( code == MDM_ERROR ) 
    {
        if ( gsm_modem && gsm_modem->network && gsm_modem->network->get_status_error )
        {
            gsm_modem->network->get_status_error ( NULL ); 
        }
        return AT_HANDLER_DONE_ERROR;
    }
    else if ( code == MDM_OK ) 
    {
        ascii *token = MDM_StrStr ( response, MDM_Sym2Str ( symbol_p, MDM_CREG ) );

        if ( token ) 
        {
        token = ( ascii * )strstr ( ( const char * )token, "," );
        if ( token ) 
        {
        uint32_t code = atoi ( ( const char* )++token );
        if(code) 
        {	
        if(code==1)
        {
        lgsm_network_get_gprs_status(NULL);
        }
        else
        {
        return AT_HANDLER_ERROR;
        }
        return AT_HANDLER_DONE;
        }				
        } 
        return AT_HANDLER_ERROR;
        }
    }

  return AT_HANDLER_DONT_UNDERSTAND;
}

static AtCmdHandler_Status PDP_Handler_GprsAttach ( MDM_CmdTypedef *at, MDM_RspTypedef *response );
//static AtCmdHandler_Status PDP_Handler_AddContext ( MDM_CmdTypedef *at, MDM_RspTypedef *response );
//static AtCmdHandler_Status PDP_Handler_SocketConnectService( MDM_CmdTypedef *at, MDM_RspTypedef *response );
//static AtCmdHandler_Status PDP_Handler_SocketCloseService( MDM_CmdTypedef *at, MDM_RspTypedef *response );
//static AtCmdHandler_Status PDP_Handler_Activate ( MDM_CmdTypedef *at, MDM_RspTypedef *response );
//static AtCmdHandler_Status PDP_Handler_QuerySendIsValid( MDM_CmdTypedef *at, MDM_RspTypedef *response );

static MDM_CmdTypedef pdp_commands[] = 
{
  /* GPRS attach or detach */
  { ATTACH_GPRS_NETWORK, "AT+CGATT=1\r\n", 
  	2000, 2,
    PDP_Handler_GprsAttach, SIM_READY, false },

//  /* Hang up current active PDP */
//  { ADD_PDP_CONTEXT, "AT+CGDCONT=%s\r\n",              
//  	2000, 3,
//    PDP_Handler_AddContext, SIM_READY, false },
//	
//		  /* activates incoming call */
//  { ACTIVE_PDP_CONTEXT, "AT+QISTAT\r\n", 
//  	1500, 3,
//    PDP_Handler_Activate, SIM_READY, false },

//	 /*Connect to tcpservice */
//  { SOCKET_TCP_SERVICE, "AT+QIOPEN=%s\r\n",              
//  	500, 3,
//    PDP_Handler_SocketConnectService, SIM_READY, false },
//	
//	/*close to tcpservice */
//  { SOCKET_TCP_CLOSE, "AT+QPOWD=1\r\n",              
//  	500, 3,
//    PDP_Handler_SocketCloseService, SIM_READY, false },

//	  /* DATA send is valid */
//   { PDP_QUERY_SEND_IsVALID, "AT+QISEND=%s\r\n", 
//	 3000, 0,
//		PDP_Handler_QuerySendIsValid, SIM_READY, false },

  { 0, NULL, 0, 0, NULL, SIM_UNKNOWN, false }

}, *pdp_command_p = pdp_commands;


static AtCmdHandler_Status PDP_Handler_GprsAttach ( MDM_CmdTypedef *at, MDM_RspTypedef *response )
{
  MDM_RSP_ID code = MDM_GetResultCode ( response );

  /* Modem didn't reply or replied with an error */
  if ( code == MDM_ERROR )
  {
    return AT_HANDLER_RETRY;
  }
  else if ( code == MDM_OK )
  {
		lgsm_pdp_add_context(NULL,1,"CMNET");
    return AT_HANDLER_DONE;
  }

  return AT_HANDLER_DONT_UNDERSTAND;
}


void PDP_Command_AddContext ( void* ipc_data, int index, const char *APN )
{
  ascii params[ 30 ];

  if ( APN )
  {
    sprintf ( ( char * )params, "%d,\"IP\",\"%s\"", index, APN );
    MDM_PostAtCmdByID ( pdp_command_p, 
                        ADD_PDP_CONTEXT,
                        params );  
  } 
}
/*
**************************************************************************
* 函数名称： CTCC_PDP_Command_AddContext
* 功能描述： 
* 输入参数： NULL
* 输出参数： NULL
* 返 回 值： 
* 其它说明： 
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2017/09/29	  	V1.1.0	     goly         XXXX
***************************************************************************
*/

extern void PDP_Command_ConnectTCPservice(int socket ,const char *ConnectMode, const char *IPaddress,int Port)
{
	ascii params[ 100 ];
	sprintf ( ( char * )params,"\"%s\",\"%s\",%u",ConnectMode, IPaddress, Port);
  MDM_PostAtCmdByID ( pdp_command_p, 
                      SOCKET_TCP_SERVICE,
                      params);

}

/*
**************************************************************************
* 函数名称： NETWORK_Command_NetworkRegister
* 功能描述： 注册网络
* 输入参数：
* 输出参数： 
* 返 回 值： 
* 其它说明： 
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2017/10/12	  	V1.1.0	     goly         XXXX
***************************************************************************
*/
extern void NETWORK_Command_NetworkRegister ( void* ipc_data )
{

	MDM_PostAtCmdByID ( network_command_p, 
                      NETWORK_REG_ENABLE, 
                      NULL );
}


/*
**************************************************************************
* 函数名称： MDM_GeneralAtInitWithSIMReady
* 功能描述： General At send when sim is ready
* 输入参数： 
* 输出参数： 
* 返 回 值： 
* 其它说明： 
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2017/10/12	  	V1.1.0	     goly         XXXX
***************************************************************************
*/
void MDM_GeneralAtInitWithSIMReady(void* ipc_data)
{
	  lgsm_network_register_network(NULL);
}

/*
**************************************************************************
* 函数名称： SIM_Command_QueryPINstatus
* 功能描述： 查询PIN状态
* 输入参数： NULL
* 输出参数： NULL
* 返 回 值： 
* 其它说明： 
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2017/09/29	  	V1.1.0	     goly         XXXX
***************************************************************************
*/
extern void SIM_Command_QueryPINstatus ( void* ipc_data )
{

  MDM_PostAtCmdByID ( sim_command_p, 
                      PIN_QUERY, 
                      NULL );
}

static AtCmdHandler_Status MDM_Handler_ReadSerialPortRate ( MDM_CmdTypedef *at, MDM_RspTypedef *response )
{
  MDM_RSP_ID code = MDM_GetResultCode ( response );
//  ascii *token = NULL;

  if ( code == MDM_OK )
  {
		lgsm_sim_get_auth_status(NULL);
		return AT_HANDLER_DONE; 
  }

  return AT_HANDLER_DONT_UNDERSTAND; 
}


/*
**************************************************************************
* 函数名称： MDM_PostAliveTest
* 功能描述： 模块指令AT
* 输入参数： 
* 输出参数： 
* 返 回 值： 
* 其它说明： 
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2017/10/12	  	V1.1.0	     goly         XXXX
***************************************************************************
*/
void MDM_PostAliveTest ( void )
{
    MDM_PostAtCmdByID( command_p, 
                       REPLY_COMMAND, 
                       NULL ); 
}
/*
**************************************************************************
* 函数名称： MDM_PostAliveTest
* 功能描述： 模块指令AT
* 输入参数： 
* 输出参数： 
* 返 回 值： 
* 其它说明： 
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2017/10/12	  	V1.1.0	     goly         XXXX
***************************************************************************
*/
static void MDM_Command_SetECHO ( void )
{
    MDM_PostAtCmdByID( command_p, 
                       ENABLE_ECHO, 
                       NULL ); 
}
/*
**************************************************************************
* 函数名称： MDM_GeneralAtInit
* 功能描述： 通用AT指令
* 输入参数： 
* 输出参数： 
* 返 回 值： 
* 其它说明： 
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2017/10/12	  	V1.1.0	     goly         XXXX
***************************************************************************
*/
 static void MDM_GeneralAtInit ( void ) 
{
  MDM_Command_SetECHO();
  MDM_PostAtCmdByID ( command_p, READ_SERIAL_PORT_RATE,NULL ); 
}
/*
**************************************************************************
* 函数名称： MDM_Handler_Alive
* 功能描述： 模块保活处理
* 输入参数： 
* 输出参数： 
* 返 回 值： 
* 其它说明： 
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2017/10/12	  	V1.1.0	     goly         XXXX
***************************************************************************
*/
static AtCmdHandler_Status MDM_Handler_Alive ( MDM_CmdTypedef *at, MDM_RspTypedef *response )
{
  MDM_RSP_ID code = MDM_GetResultCode ( response );

  /* Modem didn't reply or replied with an error */
  if ( code == MDM_TIME_OUT )
  {
    if ( gsm_modem && gsm_modem->serial && gsm_modem->serial->no_response_error )
    {
      /* Ask vendor if it can deal with an unresponsive modem */
      gsm_modem->serial->no_response_error ( NULL );  
    }      

    return AT_HANDLER_ERROR;
  }
  else if ( code == MDM_OK )
  {
    /* we've got a response, modem is alive. Start initializations */
    if ( gsm_modem && gsm_modem->status != MDM_INITIALIZING )
    {
      gsm_modem->status = MDM_INITIALIZING;
    }
		
		MDM_GeneralAtInit ();
    return AT_HANDLER_DONE;
  }

  return AT_HANDLER_DONT_UNDERSTAND;
}


/*
**************************************************************************
* 函数名称： MDM_Utils_Handler
* 功能描述： 通用指令处理
* 输入参数： 
* 输出参数： 
* 返 回 值： 
* 其它说明： 
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2017/10/12	  	V1.1.0	     goly         XXXX
***************************************************************************
*/
extern AtCmdHandler_Status MDM_Utils_Handler ( MDM_CmdTypedef *at, MDM_RspTypedef *response )
{
  MDM_RSP_ID code = MDM_GetResultCode ( response );

  switch ( code )
  {
    case MDM_OK:
    	return AT_HANDLER_DONE;
            
    case MDM_ERROR:
     	return AT_HANDLER_DONE_ERROR;
            
    case MDM_TIME_OUT:
      return AT_HANDLER_RETRY;

    default:
      return AT_HANDLER_DONT_UNDERSTAND;
  }
}

